/******************************************************************************
 * (C) 成都齐乐科技有限公司
 * 描述：
 *****************************************************************************/

var LoadTask = require('../../util/loadTask').LoadTask;
var config = require('../../../config/tasks.json');

//-----------------------------------------------------------------------------

function TaskTemplate () {
    this.id = 0;                // 模版编号
    this.desc = "";             // 模版描述
    this.count = 0;             // 任务量
    this.reward = {};           // 奖励
}

function Task() {
    this.tempalteID = 0;        // 模版编号
    this.id = 0;                // 任务编号
    this.count = 0;             // 任务量
    this.rewad = {};            // 任务奖励
}

function TaskManager() {
    this._maxTemplateID = 0;    // 最大任务编号
    this._templates = {};       // 任务模版
    this._maxTaskID = 0;        // 最大任务编号
    this._tasks = {};           // 任务列表
}
TaskManager._id = "_TASK";

TaskManager.prototype = {

    __init: function() {
        var self = this;

        // 添加任务
        var loadTask = new LoadTask(function(){
            config.tasks.forEach(function(task){
                self.addTask(task.tempalteID,
                    task.count,
                    task.reward);
            });
        });

        // 添加任务模版
        config.templates.forEach(function(template){
            loadTask.addLoad(template.id);
            self.addTemplate(
                template.desc,
                template.count,
                template.reward,
                function(){
                    loadTask.finishLoad(template.id);
                }
            );
        });
    },

    /**
     * 初始化。
     * @param callback  回调函数
     */
    init: function(callback) {
        var self = this;

        // 查询任务数据，不存在则创建
        DB.task.findOne({_id: TaskManager._id}, {}, function(err, doc){
            if (doc) {
                self._maxTemplateID = doc.maxTemplateID || 0;
                self._templates = doc.templates || {};
                self._maxTaskID = doc.maxTaskID || 0;
                self._tasks = doc.tasks || {};
                callback && callback();
            } else {

                DB.task.insertOne({
                    _id: TaskManager._id,
                    maxTemplateID: self._maxTemplateID,
                    templates: self._templates,
                    maxTaskID: self._maxTaskID,
                    tasks: self._tasks}, function(err, res){

                    // 临时使用
                    if (!err) {
                        self.__init();
                    }
                    callback(err);
                });
            }
        });
    },

    /**
     * 添加任务模版。
     * @param desc          任务描述
     * @param count         任务量
     * @param reward        任务奖励
     * @param callback      回调函数
     */
    addTemplate: function(desc, count, reward, callback) {
        var self = this;

        var taskTemplate = new TaskTemplate();
        taskTemplate.id = ++self._maxTemplateID;
        taskTemplate.desc = desc;
        taskTemplate.count = count;
        taskTemplate.reward = reward;

        this._templates[taskTemplate.id] = taskTemplate;

        DB.task.update({_id:TaskManager._id},
            {$set:{
                maxTemplateID: self._maxTemplateID,
                templates: self._templates
            }}, function(err, res){
                callback && callback(err);
            });
    },

    listTemplates: function(callback) {
        callback && callback(this._templates);
    },

    addTask: function(templateId, count, reward, callback) {
        var self = this;
        count = count || 0; reward = reward || null;

        if (self._templates.hasOwnProperty(templateId)) {
            var taskTemplate = self._templates[templateId];

            var task = new Task();
            task.tempalteID = templateId;
            task.id = ++self._maxTaskID;

            if (taskTemplate.count == 0) { //
                task.count = count;
                task.reward = reward;
            }

            self._tasks[task.id] = task;

            DB.task.update({_id:TaskManager._id},
                {$set:{
                    maxTaskID: self._maxTaskID,
                    tasks: self._tasks
                }}, function(err, res){
                    callback && callback(err);
                });
            return;
        }

        callback && callback("NO TEMPLATE");
    },

    listTasks: function(callback) {
        callback && callback(ExObject.values(this._tasks));
    },

    /**
     * 查询任务列表。
     * @param player    玩家数据
     * @param cb        回调函数
     */
    query: function(player, cb) {
        var self = this;

        var rtnTasks = [];
        ExObject.each(self._tasks, function(taskId, task){
            taskId = +taskId;

            var rtnTask = {};
            var userTask = player.getTask(taskId);
            userTask.curCount = userTask.curCount || 0;             // 完成的任务量
            userTask.rewarded = userTask.rewarded || false;         // 是否已经领取奖励

            rtnTask.template = self._templates[task.tempalteID];    // 模版数据
            rtnTask.id = taskId;                                    // 任务编号
            rtnTask.info = userTask;                                // 完成情况

            if (rtnTask.template.count == 0) {
                rtnTask.count = task.count;
                rtnTask.reward = task.reward;
            }

            rtnTasks.push(rtnTask);
        });

        cb(null, rtnTasks);
    },

    /**
     * 更新任务。
     * @param player    玩家数据
     * @param msg       更新消息
     * @param cb        回调函数
     */
    update: function(player, msg, cb) {
        var self = this;

        var userTask = player.getTask(msg.taskId);
        userTask.curCount = userTask.curCount || 0;             // 完成的任务量
        userTask.rewarded = userTask.rewarded || false;         // 是否已经领取奖励

        userTask.curCount += msg.finishedCount;                 // 完成量

        player.updateTask(msg.taskId, userTask);                // 更新任务

        cb(null);
    },

    /**
     * 领取任务奖励。
     * @param player    玩家数据
     * @param taskId    任务编号
     * @param cb        回调函数
     */
    getReward: function(player, taskId, cb) {
        var self = this;

        var userTask = player.getTask(taskId);
        userTask.curCount = userTask.curCount || 0;             // 完成的任务量
        userTask.rewarded = userTask.rewarded || false;         // 是否已经领取奖励

        var taskDef = self._tasks[taskId];                      // 任务定义
        var taskTemplate = self._templates[taskDef.tempalteID]; // 任务模版

        var totalCount = taskTemplate.count;
        if (totalCount == 0) {
            totalCount = taskDef.count;
        }

        if (userTask.rewarded) {    // 奖励已经领取
            cb(Code.TASK_ALREADY_REWARD);
        } else if (userTask.curCount < totalCount) {   // 任务未完成
            cb(Code.TASK_NOT_FINISHED);
        } else {
            // 发放奖励
            var reward = taskTemplate.reward;
            if (taskTemplate.count == 0) {
                reward = taskDef.reward;
            }
            reward = reward || {};

            ExObject.each(reward, function(resName, resValue){
                player.addResource(resName, resValue, "TASK");
            });

            userTask.rewarded = true;
            player.updateTask(taskId, userTask);                 // 更新任务
            cb(Code.SUCCESS);
        }
    }
};

exports.TaskManager = TaskManager;